package com.boss.salary.dao;

import com.boss.framework.dto.PaginationDTO;
import com.boss.salary.entity.AgencyVerify;
import com.boss.salary.entity.PersonOperate;
import com.boss.salary.vo.UnitSalaryReportVO;

import java.util.List;
import java.util.Map;


public interface IPersonOperateDao {

    /**
     * 分页查询 人员信息操作表数据
     * @param paginationDTO
     * @return
     */
    List<PersonOperate> queryPersonOperatePage(PaginationDTO paginationDTO);

    /**
     * 获取人员信息操作表数据数量
     * @return
     */
    int queryPersonOperateTotal();

    /**
     * 增加 人员信息操作表数据
     * @param personOperate
     * @return
     */
    void savePersonOperate(PersonOperate personOperate);

    /**
     * 通过身份证号和银行卡号判断info表中是否已存在
     * @param idenNo
     * @param salaCardNo
     * @return
     */
    int verifyIdenNoAndBankCardRepeatFromInfo(String idenNo, String salaCardNo, String personId,String mofDivCode);

    /**
     * 通过身份证号和银行卡号判断operate表中是否已存在已维护但未生效的数据
     * @param idenNo
     * @param salaCardNo
     * @param personId
     * @return
     */
    int verifyIdenNoAndBankCardRepeatFromOperate(String idenNo, String salaCardNo, String personId,String mofDivCode);

    /**
     * 通过身份证号判断operate表中是否已存在待调入人员
     * @param idenNo
     * @param mofDivCode
     * @return
     */
    int verifyIdenNoAndBankCardRepeatFromOperateCheck(String idenNo, String mofDivCode);

    /**
     * 查询单位增员和单位减员人数
     * @return
     */
    UnitSalaryReportVO selectPersonPlusAndMinusCount(String agencyId, String salaryMonth);

    /**
     * 更新 人员信息操作表数据
     * @param personOperate
     * @return
     */
    void updatePersonOperate(PersonOperate personOperate);

    /**
     * 根据id删除人员信息操作表数据
     * @param id
     * @return
     */
    void deletePersonOperate(String id);

    /**
     * 身份证核对查询
     * @param paginationDTO
     * @return
     */
    List<PersonOperate> getPersonOperatePage(PaginationDTO paginationDTO,Map<String, Object> queryParam);

    /**
     * 根据参数查询总数
     * @param queryParam
     * @return
     */
    int getPersonOperateTotal(Map<String, Object> queryParam);

    /**
     * 获取人员变动情况
     * @param paginationDTO
     * @return
     */
    List<PersonOperate> getPersonChangeListPage(PaginationDTO paginationDTO,Map<String, Object> queryParam);

    /**
     * 获取人员变动情况总数
     * @param queryParam
     * @return
     */
    int getPersonChangeListTotal(Map<String, Object> queryParam);

    /**
     * 获取人员变动总数
     * @param queryParam
     * @return
     */
    int getPersonChangeTotal(Map<String, Object> queryParam);

    /**
     * 操作表最新的人员数据 -- 人员变动编辑
     * @param paginationDTO
     * @return
     */
    List<PersonOperate> getPersonInfoChangeOperatePage(PaginationDTO paginationDTO,Map<String, Object> queryParam);

    /**
     * 操作表最新的人员数据总数 -- 人员变动编辑
     * @param queryParam
     * @return
     */
    int getPersonInfoChangeOperateTotal(Map<String, Object> queryParam);

    /**
     * 查询待调入人员数量
     * @param queryParam
     * @return
     */
    int getPersonWaitInPersonTotal(Map<String, Object> queryParam);

    /**
     * 获取在职和离休人数
     * @return
     */
    Map<String, Object> getStateNum(Map<String, Object> queryParam);

    /**
     * 获取人员的变更记录
     * @param agencyId
     * @param personId
     * @return
     */
    List<PersonOperate> getPersonOperateRecord(String agencyId, String personId, String operateCode,String creatTime);

    /**
     * 获取旧身份证号
     * @param personid
     * @return
     */
    PersonOperate getOldIdenNo(String personid);

    /**
     * 获取所有未生效的数据
     * @return
     */
    List<PersonOperate> getPersonNotReal();


    /**
     * 批量插入修改银行卡号
     * @param personOperates
     */
    void batchInsertUpdate(List<PersonOperate> personOperates);

    /**
     * 查询减员和增员
     * @param agencyId
     * @param salaryMonth
     * @return
     */
    UnitSalaryReportVO selectPersonMinusAndPlus(String agencyId, String salaryMonth);

    /**
     * 根据id修改人员审核状态
     * @param id
     * @param verifyState
     */
    void updateVerifyStateById(String id, String verifyState);

    /**
     * 删除点击调入后生成的人员操作数据
     * @param operateId
     */
    void physicalDeleteById(String operateId);

    /**
     * 删除调入后生成的人员操作数据
     * @param personId
     * @param inFromAgency
     * @param salaryMonth
     */
    void physicalDeleteInPerson(String personId, String inFromAgency, String salaryMonth);

    /**
     * 根据人员id查询该人员是否已经调入目标单位
     * @param personId
     * @param inFromAgency
     * @param salaryMonth
     * @return
     */
    int selectInPersonNumByPersonId(String personId, String inFromAgency, String salaryMonth);

    /**
     * 根据查询人员id获取历史新增人员数据
     * @param personId
     * @return
     */
    PersonOperate selectHistoryAddOperateByPersonId(String personId);



    /**
     * 根据查询人员id获取历史新增人员数据
     * @param personId
     * @return
     */
    PersonOperate selectHistoryOperateByPersonId(String personId,String operateId);
    /**
     * 查询待导入人员信息
     * @param agencyId
     * @param personId
     * @param
     * @return
     */
    List<PersonOperate> getPersonOperatePersonState(String agencyId, String personId, String personState);

    /**
     * 根据身份证号返回人员信息
     * @param IdenNo
     * @param salary_month
     * @return
     */
    List<PersonOperate> getPersonOperateCodeByIdenNos(List<String> IdenNo,String salary_month,String agencyId);


    /**
     * 根据单位id和月份查询变动人员id
     * @param agencyId
     * @param salaryMonth
     * @return
     */
    List<String> selectChangePersonByAgencyMonth(String agencyId, String salaryMonth);

    /**
     * 根据单位id查找当前单位下的人数
     * @param agencyId
     * @return
     */
    Integer queryExistingNumber(String agencyId,String payCode);

    /**
     * 月结时自动上报单位存在已修改信息自动修改为下个月操作
     * @param params
     */
    void batchUpdateAutoMonthEnd(List<Object[]> params);

    /**
     * 自动上报的将附件带到下个月
     * @param params
     */
    void batchUpdateAutoFile(List<Object[]> params);

    void updatePersonOperateCode(List<AgencyVerify> updateList);

    PersonOperate getSalaryMonth(String agencyId);
}
